00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef __THREADMAN_H__
00016 #define __THREADMAN_H__
00017
00018 #include <psptypes.h>
00019 #include <pspkerneltypes.h>
00020
00021 #include <pspdebug.h>
00022
00023
00024
00025
00026
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034
00038
00040 typedef struct SceKernelSysClock {
00041 SceUInt32 low;
00042 SceUInt32 hi;
00043 } SceKernelSysClock;
00044
00046 enum PspThreadAttributes
00047 {
00049 PSP_THREAD_ATTR_VFPU = 0x00004000,
00052 PSP_THREAD_ATTR_USER = 0x80000000,
00054 PSP_THREAD_ATTR_USBWLAN = 0xa0000000,
00056 PSP_THREAD_ATTR_VSH = 0xc0000000,
00058 PSP_THREAD_ATTR_SCRATCH_SRAM = 0x00008000,
00060 PSP_THREAD_ATTR_NO_FILLSTACK = 0x00100000,
00062 PSP_THREAD_ATTR_CLEAR_STACK = 0x00200000,
00063 };
00064
00065
00066 #define THREAD_ATTR_VFPU PSP_THREAD_ATTR_VFPU
00067 #define THREAD_ATTR_USER PSP_THREAD_ATTR_USER
00068
00069
00070
00071
00072 typedef int (*SceKernelThreadEntry)(SceSize args, void *argp);
00073
00075 typedef struct SceKernelThreadOptParam {
00077 SceSize size;
00079 SceUID stackMpid;
00080 } SceKernelThreadOptParam;
00081
00085 typedef struct SceKernelThreadInfo {
00087 SceSize size;
00089 char name[32];
00091 SceUInt attr;
00093 int status;
00095 SceKernelThreadEntry entry;
00097 void * stack;
00099 int stackSize;
00101 void * gpReg;
00103 int initPriority;
00105 int currentPriority;
00107 int waitType;
00109 SceUID waitId;
00111 int wakeupCount;
00113 int exitStatus;
00115 SceKernelSysClock runClocks;
00117 SceUInt intrPreemptCount;
00119 SceUInt threadPreemptCount;
00121 SceUInt releaseCount;
00122 } SceKernelThreadInfo;
00123
00127 typedef struct SceKernelThreadRunStatus {
00128 SceSize size;
00129 int status;
00130 int currentPriority;
00131 int waitType;
00132 int waitId;
00133 int wakeupCount;
00134 SceKernelSysClock runClocks;
00135 SceUInt intrPreemptCount;
00136 SceUInt threadPreemptCount;
00137 SceUInt releaseCount;
00138 } SceKernelThreadRunStatus;
00139
00140
00141 enum PspThreadStatus
00142 {
00143 PSP_THREAD_RUNNING = 1,
00144 PSP_THREAD_READY = 2,
00145 PSP_THREAD_WAITING = 4,
00146 PSP_THREAD_SUSPEND = 8,
00147 PSP_THREAD_STOPPED = 16,
00148 PSP_THREAD_KILLED = 32,
00149 };
00150
00169 SceUID sceKernelCreateThread(const char *name, SceKernelThreadEntry entry, int initPriority,
00170 int stackSize, SceUInt attr, SceKernelThreadOptParam *option);
00171
00179 int sceKernelDeleteThread(SceUID thid);
00180
00188 int sceKernelStartThread(SceUID thid, SceSize arglen, void *argp);
00189
00195 int sceKernelExitThread(int status);
00196
00202 int sceKernelExitDeleteThread(int status);
00203
00211 int sceKernelTerminateThread(SceUID thid);
00212
00220 int sceKernelTerminateDeleteThread(SceUID thid);
00221
00227 int sceKernelSuspendDispatchThread(void);
00228
00237 int sceKernelResumeDispatchThread(int state);
00238
00244 int sceKernelSleepThread(void);
00245
00255 int sceKernelSleepThreadCB(void);
00256
00264 int sceKernelWakeupThread(SceUID thid);
00265
00273 int sceKernelCancelWakeupThread(SceUID thid);
00274
00282 int sceKernelSuspendThread(SceUID thid);
00283
00291 int sceKernelResumeThread(SceUID thid);
00292
00301 int sceKernelWaitThreadEnd(SceUID thid, SceUInt *timeout);
00302
00311 int sceKernelWaitThreadEndCB(SceUID thid, SceUInt *timeout);
00312
00323 int sceKernelDelayThread(SceUInt delay);
00324
00335 int sceKernelDelayThreadCB(SceUInt delay);
00336
00344 int sceKernelDelaySysClockThread(SceKernelSysClock *delay);
00345
00354 int sceKernelDelaySysClockThreadCB(SceKernelSysClock *delay);
00355
00364 int sceKernelChangeCurrentThreadAttr(int unknown, SceUInt attr);
00365
00381 int sceKernelChangeThreadPriority(SceUID thid, int priority);
00382
00390 int sceKernelRotateThreadReadyQueue(int priority);
00391
00399 int sceKernelReleaseWaitThread(SceUID thid);
00400
00406 int sceKernelGetThreadId(void);
00407
00413 int sceKernelGetThreadCurrentPriority(void);
00414
00422 int sceKernelGetThreadExitStatus(SceUID thid);
00423
00429 int sceKernelCheckThreadStack(void);
00430
00439 int sceKernelGetThreadStackFreeSize(SceUID thid);
00440
00458 int sceKernelReferThreadStatus(SceUID thid, SceKernelThreadInfo *info);
00459
00468 int sceKernelReferThreadRunStatus(SceUID thid, SceKernelThreadRunStatus *status);
00469
00470
00471
00472
00474 typedef struct SceKernelSemaOptParam {
00476 SceSize size;
00477 } SceKernelSemaOptParam;
00478
00482 typedef struct SceKernelSemaInfo {
00484 SceSize size;
00486 char name[32];
00488 SceUInt attr;
00490 int initCount;
00492 int currentCount;
00494 int maxCount;
00496 int numWaitThreads;
00497 } SceKernelSemaInfo;
00498
00515 SceUID sceKernelCreateSema(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option);
00516
00523 int sceKernelDeleteSema(SceUID semaid);
00524
00539 int sceKernelSignalSema(SceUID semaid, int signal);
00540
00555 int sceKernelWaitSema(SceUID semaid, int signal, SceUInt *timeout);
00556
00571 int sceKernelWaitSemaCB(SceUID semaid, int signal, SceUInt *timeout);
00572
00581 int sceKernelPollSema(SceUID semaid, int signal);
00582
00591 int sceKernelReferSemaStatus(SceUID semaid, SceKernelSemaInfo *info);
00592
00593
00594
00595
00597 typedef struct SceKernelEventFlagInfo {
00598 SceSize size;
00599 char name[32];
00600 SceUInt attr;
00601 SceUInt initPattern;
00602 SceUInt currentPattern;
00603 int numWaitThreads;
00604 } SceKernelEventFlagInfo;
00605
00606 struct SceKernelEventFlagOptParam {
00607 SceSize size;
00608 };
00609
00610 typedef struct SceKernelEventFlagOptParam SceKernelEventFlagOptParam;
00611
00613 enum PspEventFlagAttributes
00614 {
00616 PSP_EVENT_WAITMULTIPLE = 0x200
00617 };
00618
00620 enum PspEventFlagWaitTypes
00621 {
00623 PSP_EVENT_WAITAND = 0,
00625 PSP_EVENT_WAITOR = 1,
00627 PSP_EVENT_WAITCLEAR = 0x20
00628 };
00629
00645 SceUID sceKernelCreateEventFlag(const char *name, int attr, int bits, SceKernelEventFlagOptParam *opt);
00646
00655 int sceKernelSetEventFlag(SceUID evid, u32 bits);
00656
00665 int sceKernelClearEventFlag(SceUID evid, u32 bits);
00666
00676 int sceKernelPollEventFlag(int evid, u32 bits, u32 wait, u32 *outBits);
00677
00688 int sceKernelWaitEventFlag(int evid, u32 bits, u32 wait, u32 *outBits, SceUInt *timeout);
00689
00700 int sceKernelWaitEventFlagCB(int evid, u32 bits, u32 wait, u32 *outBits, SceUInt *timeout);
00701
00709 int sceKernelDeleteEventFlag(int evid);
00710
00719 int sceKernelReferEventFlagStatus(SceUID event, SceKernelEventFlagInfo *status);
00720
00721
00722
00723
00725 typedef struct SceKernelMbxOptParam {
00727 SceSize size;
00728 } SceKernelMbxOptParam;
00729
00733 typedef struct SceKernelMbxInfo {
00735 SceSize size;
00737 char name[32];
00739 SceUInt attr;
00741 int numWaitThreads;
00743 int numMessages;
00745 void *firstMessage;
00746 } SceKernelMbxInfo;
00747
00762 SceUID sceKernelCreateMbx(const char *name, SceUInt attr, SceKernelMbxOptParam *option);
00763
00770 int sceKernelDeleteMbx(SceUID mbxid);
00771
00789 int sceKernelSendMbx(SceUID mbxid, void *message);
00790
00807 int sceKernelReceiveMbx(SceUID mbxid, void **pmessage, SceUInt *timeout);
00808
00825 int sceKernelReceiveMbxCB(SceUID mbxid, void **pmessage, SceUInt *timeout);
00826
00842 int sceKernelPollMbx(SceUID mbxid, void **pmessage);
00843
00859 int sceKernelCancelReceiveMbx(SceUID mbxid, int *pnum);
00860
00869 int sceKernelReferMbxStatus(SceUID mbxid, SceKernelMbxInfo *info);
00870
00871
00872
00873
00875 typedef SceUInt (*SceKernelAlarmHandler)(void *common);
00876
00878 typedef struct SceKernelAlarmInfo {
00881 SceSize size;
00882
00883 SceKernelSysClock schedule;
00885 SceKernelAlarmHandler handler;
00887 void * common;
00888 } SceKernelAlarmInfo;
00889
00898 SceUID sceKernelSetAlarm(SceUInt clock, SceKernelAlarmHandler handler, void *common);
00899
00909 SceUID sceKernelSetSysClockAlarm(SceKernelSysClock *clock, SceKernelAlarmHandler handler, void *common);
00910
00918 int sceKernelCancelAlarm(SceUID alarmid);
00919
00928 int sceKernelReferAlarmStatus(SceUID alarmid, SceKernelAlarmInfo *info);
00929
00930
00931
00933 typedef int (*SceKernelCallbackFunction)(int arg1, int arg2, void *arg);
00934
00936 typedef struct SceKernelCallbackInfo {
00938 SceSize size;
00940 char name[32];
00942 SceUID threadId;
00944 SceKernelCallbackFunction callback;
00946 void * common;
00948 int notifyCount;
00950 int notifyArg;
00951 } SceKernelCallbackInfo;
00952
00968 int sceKernelCreateCallback(const char *name, SceKernelCallbackFunction func, void *arg);
00969
00979 int sceKernelReferCallbackStatus(SceUID cb, SceKernelCallbackInfo *status);
00980
00988 int sceKernelDeleteCallback(SceUID cb);
00989
00998 int sceKernelNotifyCallback(SceUID cb, int arg2);
00999
01007 int sceKernelCancelCallback(SceUID cb);
01008
01016 int sceKernelGetCallbackCount(SceUID cb);
01017
01023 int sceKernelCheckCallback(void);
01024
01025
01026
01028 enum SceKernelIdListType
01029 {
01030 SCE_KERNEL_TMID_Thread = 1,
01031 SCE_KERNEL_TMID_Semaphore = 2,
01032 SCE_KERNEL_TMID_EventFlag = 3,
01033 SCE_KERNEL_TMID_Mbox = 4,
01034 SCE_KERNEL_TMID_Vpl = 5,
01035 SCE_KERNEL_TMID_Fpl = 6,
01036 SCE_KERNEL_TMID_Mpipe = 7,
01037 SCE_KERNEL_TMID_Callback = 8,
01038 SCE_KERNEL_TMID_ThreadEventHandler = 9,
01039 SCE_KERNEL_TMID_Alarm = 10,
01040 SCE_KERNEL_TMID_VTimer = 11,
01041 SCE_KERNEL_TMID_SleepThread = 64,
01042 SCE_KERNEL_TMID_DelayThread = 65,
01043 SCE_KERNEL_TMID_SuspendThread = 66,
01044 SCE_KERNEL_TMID_DormantThread = 67,
01045 };
01046
01058 int sceKernelGetThreadmanIdList(enum SceKernelIdListType type, SceUID *readbuf, int readbufsize, int *idcount);
01059
01061 typedef struct SceKernelSystemStatus {
01063 SceSize size;
01065 SceUInt status;
01067 SceKernelSysClock idleClocks;
01069 SceUInt comesOutOfIdleCount;
01071 SceUInt threadSwitchCount;
01073 SceUInt vfpuSwitchCount;
01074 } SceKernelSystemStatus;
01075
01083 int sceKernelReferSystemStatus(SceKernelSystemStatus *status);
01084
01085
01097 SceUID sceKernelCreateMsgPipe(const char *name, int part, int attr, void *unk1, void *opt);
01098
01106 int sceKernelDeleteMsgPipe(SceUID uid);
01107
01120 int sceKernelSendMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
01121
01134 int sceKernelSendMsgPipeCB(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
01135
01147 int sceKernelTrySendMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2);
01148
01161 int sceKernelReceiveMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
01162
01175 int sceKernelReceiveMsgPipeCB(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
01176
01188 int sceKernelTryReceiveMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2);
01189
01199 int sceKernelCancelMsgPipe(SceUID uid, int *psend, int *precv);
01200
01202 typedef struct SceKernelMppInfo {
01203 SceSize size;
01204 char name[32];
01205 SceUInt attr;
01206 int bufSize;
01207 int freeSize;
01208 int numSendWaitThreads;
01209 int numReceiveWaitThreads;
01210 } SceKernelMppInfo;
01211
01220 int sceKernelReferMsgPipeStatus(SceUID uid, SceKernelMppInfo *info);
01221
01222
01223
01224 struct SceKernelVplOptParam {
01225 SceSize size;
01226 };
01227
01239 SceUID sceKernelCreateVpl(const char *name, int part, int attr, unsigned int size, struct SceKernelVplOptParam *opt);
01240
01248 int sceKernelDeleteVpl(SceUID uid);
01249
01260 int sceKernelAllocateVpl(SceUID uid, unsigned int size, void **data, unsigned int *timeout);
01261
01272 int sceKernelAllocateVplCB(SceUID uid, unsigned int size, void **data, unsigned int *timeout);
01273
01283 int sceKernelTryAllocateVpl(SceUID uid, unsigned int size, void **data);
01284
01293 int sceKernelFreeVpl(SceUID uid, void *data);
01294
01303 int sceKernelCancelVpl(SceUID uid, int *pnum);
01304
01306 typedef struct SceKernelVplInfo {
01307 SceSize size;
01308 char name[32];
01309 SceUInt attr;
01310 int poolSize;
01311 int freeSize;
01312 int numWaitThreads;
01313 } SceKernelVplInfo;
01314
01323 int sceKernelReferVplStatus(SceUID uid, SceKernelVplInfo *info);
01324
01325
01326
01327 struct SceKernelFplOptParam {
01328 SceSize size;
01329 };
01330
01343 int sceKernelCreateFpl(const char *name, int part, int attr, unsigned int size, unsigned int blocks, struct SceKernelFplOptParam *opt);
01344
01352 int sceKernelDeleteFpl(SceUID uid);
01353
01363 int sceKernelAllocateFpl(SceUID uid, void **data, unsigned int *timeout);
01364
01374 int sceKernelAllocateFplCB(SceUID uid, void **data, unsigned int *timeout);
01375
01384 int sceKernelTryAllocateFpl(SceUID uid, void **data);
01385
01394 int sceKernelFreeFpl(SceUID uid, void *data);
01395
01404 int sceKernelCancelFpl(SceUID uid, int *pnum);
01405
01407 typedef struct SceKernelFplInfo {
01408 SceSize size;
01409 char name[32];
01410 SceUInt attr;
01411 int blockSize;
01412 int numBlocks;
01413 int freeBlocks;
01414 int numWaitThreads;
01415 } SceKernelFplInfo;
01416
01425 int sceKernelReferFplStatus(SceUID uid, SceKernelFplInfo *info);
01426
01430 void _sceKernelReturnFromTimerHandler(void);
01431
01436 void _sceKernelReturnFromCallback(void);
01437
01446 int sceKernelUSec2SysClock(unsigned int usec, SceKernelSysClock *clock);
01447
01455 SceInt64 sceKernelUSec2SysClockWide(unsigned int usec);
01456
01466 int sceKernelSysClock2USec(SceKernelSysClock *clock, unsigned int *low, unsigned int *high);
01467
01477 int sceKernelSysClock2USecWide(SceInt64 clock, unsigned *low, unsigned int *high);
01478
01486 int sceKernelGetSystemTime(SceKernelSysClock *time);
01487
01493 SceInt64 sceKernelGetSystemTimeWide(void);
01494
01500 unsigned int sceKernelGetSystemTimeLow(void);
01501
01502 struct SceKernelVTimerOptParam {
01503 SceSize size;
01504 };
01505
01514 SceUID sceKernelCreateVTimer(const char *name, struct SceKernelVTimerOptParam *opt);
01515
01523 int sceKernelDeleteVTimer(SceUID uid);
01524
01533 int sceKernelGetVTimerBase(SceUID uid, SceKernelSysClock *base);
01534
01542 SceInt64 sceKernelGetVTimerBaseWide(SceUID uid);
01543
01552 int sceKernelGetVTimerTime(SceUID uid, SceKernelSysClock *time);
01553
01561 SceInt64 sceKernelGetVTimerTimeWide(SceUID uid);
01562
01571 int sceKernelSetVTimerTime(SceUID uid, SceKernelSysClock *time);
01572
01581 SceInt64 sceKernelSetVTimerTimeWide(SceUID uid, SceInt64 time);
01582
01590 int sceKernelStartVTimer(SceUID uid);
01591
01599 int sceKernelStopVTimer(SceUID uid);
01600
01601 typedef SceUInt (*SceKernelVTimerHandler)(SceUID uid, SceKernelSysClock *, SceKernelSysClock *, void *);
01602 typedef SceUInt (*SceKernelVTimerHandlerWide)(SceUID uid, SceInt64, SceInt64, void *);
01603
01614 int sceKernelSetVTimerHandler(SceUID uid, SceKernelSysClock *time, SceKernelVTimerHandler handler, void *common);
01615
01626 int sceKernelSetVTimerHandlerWide(SceUID uid, SceInt64 time, SceKernelVTimerHandlerWide handler, void *common);
01627
01635 int sceKernelCancelVTimerHandler(SceUID uid);
01636
01637 typedef struct SceKernelVTimerInfo {
01638 SceSize size;
01639 char name[32];
01640 int active;
01641 SceKernelSysClock base;
01642 SceKernelSysClock current;
01643 SceKernelSysClock schedule;
01644 SceKernelVTimerHandler handler;
01645 void * common;
01646 } SceKernelVTimerInfo;
01647
01656 int sceKernelReferVTimerStatus(SceUID uid, SceKernelVTimerInfo *info);
01657
01662 void _sceKernelExitThread(void);
01663
01671 enum SceKernelIdListType sceKernelGetThreadmanIdType(SceUID uid);
01672
01673 typedef int (*SceKernelThreadEventHandler)(int mask, SceUID thid, void *common);
01674
01676 typedef struct SceKernelThreadEventHandlerInfo {
01677 SceSize size;
01678 char name[32];
01679 SceUID threadId;
01680 int mask;
01681 SceKernelThreadEventHandler handler;
01682 void * common;
01683 } SceKernelThreadEventHandlerInfo;
01684
01685 enum ThreadEventIds
01686 {
01687 THREADEVENT_ALL = 0xFFFFFFFF,
01688 THREADEVENT_KERN = 0xFFFFFFF8,
01689 THREADEVENT_USER = 0xFFFFFFF0,
01690 THREADEVENT_CURRENT = 0
01691 };
01692
01693 enum ThreadEvents
01694 {
01695 THREAD_CREATE = 1,
01696 THREAD_START = 2,
01697 THREAD_EXIT = 4,
01698 THREAD_DELETE = 8,
01699 };
01700
01712 SceUID sceKernelRegisterThreadEventHandler(const char *name, SceUID threadID, int mask, SceKernelThreadEventHandler handler, void *common);
01713
01721 int sceKernelReleaseThreadEventHandler(SceUID uid);
01722
01731 int sceKernelReferThreadEventHandlerStatus(SceUID uid, struct SceKernelThreadEventHandlerInfo *info);
01732
01737 PspDebugProfilerRegs *sceKernelReferThreadProfiler(void);
01738
01743 PspDebugProfilerRegs *sceKernelReferGlobalProfiler(void);
01744
01747 #ifdef __cplusplus
01748 }
01749 #endif
01750
01751 #endif